#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include <vector> 
#include <functional>
//---线程控制---

/*----线程分离----*/
/*---不需要主线程执行阻塞等待---*/

const int num = 1;
void* threadRun(void* args)
{
    /*--线程分离 ,分离后禁止等待！---*/
    //pthread_detach(pthread_self());
    std::string name = static_cast<const char*>(args);
    int cnt = 5;
    while(cnt--)
    {
        std::cout<<name<<"Running..."<<std::endl;
        sleep(1);
    }
    pthread_exit(args);//终止线程
    //return args;
}

/*---线程如何终止---*/
/*1.函数return*/
/*2.pthread_exit---*/
/*3.pthread_cancel--*/
/*---如何创建多线程+等待----*/
// const int num = 10;
// void* threadRun(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     int cnt = 10;
//     while(cnt--)
//     {
//         std::cout<<name<<"Running..."<<std::endl;
//         sleep(1);
//     }
//     pthread_exit(args);//终止线程
// }
int main()
{
    /*创建多线程*/
    std::vector<pthread_t> tids;
    for(int i = 0;i<num;i++)
    {
        pthread_t tid;
        char* _name = new char[128];
        snprintf(_name,128,"thread-%d",i+1);
        pthread_create(&tid,nullptr,threadRun,_name);
        /*保存每次创建的新线程的data*/
        tids.emplace_back(tid);
    }
    /*线程等待--轮询等待*/
    for(auto& tid : tids)
    {
        void* name = nullptr;
        pthread_join(tid,&name);
        std::cout<<"main thread wait thread: "<<(const char*)name<<std::endl;
        delete [] name;
    }
    //sleep(100);
    return 0;
}
// //---线程running方法的参数理解
// class ThreadData
// {
// public:
//     std::string _name;
//     int _id;
// };
// //返回值void*可以返回一个类，让pthread_join函数接收，通过void**的参数返回给用户！
// void *ThreadRun(void *args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
//     std::cout << "new thread name = " << td->_name << "; " << "id = " << td->_id << std::endl;
//     int cnt = 10;
//     while(cnt--)
//     {
//         std::cout<<"nw thread running......,cnt = "<<cnt<<std::endl;
//         sleep(1);
//     }
//     delete td;
//     return (void*)0;
// }
// int main()
// {
//     pthread_t tid;
//     //在堆上申请空间
//     ThreadData* td = new ThreadData();

//     int n = pthread_create(&tid, nullptr, ThreadRun, (void *)td);
//     void* code = nullptr;
//     n = pthread_join(tid,&code);
//     if (n == 0)
//     {
//         std::cout << "main thread wait success!,new thread exit code: "<<(uint64_t)code<< std::endl;
//     }
//     return 0;
// }

// //---1.线程等待----
// std::string printToxHex(pthread_t& tid)
// {
//     char buffer[128];
//     snprintf(buffer,sizeof buffer,"0x%lx",tid);
//     return buffer;
// }
// void* ThreadRun(void* args)
// {
//     int cnt = 10;
//     while(cnt--)
//     {
//         std::cout<<"i am new thread,Running...,cnt = "<<cnt<<std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,ThreadRun,(void*)"thread 1");
//     //main thread最后退出
//     n = pthread_join(tid,nullptr);
//     std::string tid_str = printToxHex(tid);
//     //tid是一个虚拟地址!!
//     std::cout<<"tid : "<<tid_str<<std::endl;
//     if(n == 0)
//     {
//         std::cout<<"main thread wait success!"<<std::endl;
//     }
//     return 0;
// }
